/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package scanner;

import Modele.Port;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.PortUnreachableException;

/**
 *
 * @author julien
 */
public class ScanneurUDP extends AbstractScanneur {

    /**
     * Objet de connexion du scaneur
     */
    private DatagramSocket datagramSocket;

    /**
     * Constructeur de la classe ScanneurUDP
     * @param sc Une référence vers un objet de type ScanneurClient
     * @param adresse L'addresse cible du scanneur
     * @param p Objet de type Port vers lequelle scanner 
     */
    public ScanneurUDP(ScanneurClient sc, String adresse, Port p) {
        super(sc, adresse, p);
    }

    /**
     * Ferme la connexion du socket
     * @return Vrai si la fermeture de la connexion s'est bien déroulé
     */
    public boolean closeConnection() {
        datagramSocket.close();
        return true;
    }

    /**
     * Méthode run du thread.
     * Se connecte à un port UDP à l'addresse "adresse" puis ferme celle-ci.
     * Enfin, le thread s'efface de la liste de thread de l'objet ScanneurClient.
     */
    @Override
    public void run() {
        try {
            InetAddress address = InetAddress.getByName(adresse);
            byte[] bytes = new byte[128];
            datagramSocket = new DatagramSocket();
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
            datagramSocket.setSoTimeout(200);
            datagramSocket.connect(address, port.getNumPort());
            datagramSocket.send(dp);
            dp = new DatagramPacket(bytes, bytes.length);
            datagramSocket.receive(dp);
            port.setStatut(Port.OUVERT);
        } catch (PortUnreachableException e) {
            port.setStatut(Port.FERME);
        } catch (InterruptedIOException e) {
            port.setStatut(Port.OUVERT_OU_FILTRE);
        } catch (IOException e) {
            port.setStatut(Port.FERME);
        } finally {

            if ((scanneurClient.isIntervalleScan()
                    && (port.getStatut() == Port.OUVERT 
                    || port.getStatut() == Port.OUVERT_OU_FILTRE))
                    || !scanneurClient.isIntervalleScan()) {
                scanneurClient.ajouterNotification(port);
            }
            
            updateListThread();
            closeConnection();
        }
    }
}
